4.5 零宽断言与懒惰匹配
零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会分组保存,最终匹配结果只是一个位置而已,匹配的内容只是给指定位置添加一个限定条件,用来规定此位置之前或者之后的字符必须满足限定条件,才能使正则表达式匹配成功。
名称 | 表达式 | 注释 | 备注 |
---|---|---|---|
零宽正向先行断言 | (?=exp) | 它断言此位置后面匹配表达式exp | |
零宽负向先行断言 | (?!exp) | 它断言此位置后面不匹配表达式exp | |
零宽正向后行断言 | (?<=exp) | 它断言此位置前面匹配表达式exp | 后向断言不支持不定长表达式 |
零宽负向后行断言 | (? | 它断言此位置前面不匹配表达式exp |
import re
text= "张三100,李四32,王五56,麻子job23,小明"
t1=re.findall( "[一-龥]+(?=\d+)" ,text) #匹配的汉字后面是数字
t2=re.findall( "[一-龥]+(?!\d+)" ,text) #匹配的汉字后面不是数字
t3=re.findall( "(?<=[一-龥])\d+" ,text) #匹配连续的数字前面是汉字
t4=re.findall( "(? ,text) #匹配连续的数字前面不是汉字
print (t1)
print (t2)
print (t3)
print (t4)
返回:
['张三', '李四', '王五']
['张', '李', '王', '麻子', '小明']
['100', '32', '56']
['00', '2', '6', '23']
在对正则表达式进行长度匹配时,默认是贪婪模式,也就是尽可能地匹配更多的数据, 如果希望尽可能匹配更少的数据,可以在量词后面加问号(?),这就是懒惰模式,
名称 | 注释 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n次到m次,但尽可能少重复 |
{n}? | 重复n次以上,但尽可能少重复 |
import re
text= "1.张三2.李四3.王五4.麻子job5.小明6"
t1=re.findall( ".+(?=\d+)" ,text) #零宽断言贪婪匹配
t2=re.findall( ".+?(?=\d+)" ,text) #零宽断言懒惰匹配
print (t1)
print (t2)
返回:
['1.张三2.李四3.王五4.麻子job5.小明']
['1.张三', '2.李四', '3.王五', '4.麻子job', '5.小明']